<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        
        /**
         * generator : es6 解决异步编程的一种解决方案
         * 
         * 状态机，封装了多个内部状态
         * 
         * - 定义的方式：function 和函数名之间有*
         * 
         * - 内部搭配：yield 来使用
         * 
         * - 调用方式：和普通的函数一样
         * 
         * - 返回值：Iterator 遍历器对象  for...of  next指针 
         * 
         * 
         * 
         * */    

        //  function * run(){
        //      console.log("run")
        //  }

        //  console.log(run());

        //  let o = run();

        //  console.log(o.next())  //{value: undefined, done: true}  value:当前的状态值  done:是否循环结束


        // function* helloWorldGenerator() {
        //     yield 'hello';
        //     yield 'world';
        //     return 'ending';
        // }

        // let hello = helloWorldGenerator();  ///遍历器对象

        // console.log(hello.next())  //{value: "hello", done: false}
        // console.log(hello.next())  //{value: "world", done: false}
        // console.log(hello.next())  //{value: "ending", done: true}

        // hello.next().value

        // for(let val of hello){
        //     console.log(val)
        // }


        //async 函数

       

        function getNum(time){
            return new Promise((resolve) => {
                setTimeout(() => {
                    resolve(Math.floor(Math.random()*9))
                },time)
            })
        }

         //async 自动执行，自动赋值  async是generator的语法糖

        // async function run(){
        //     let n1 = await getNum(1000);
        //     console.log("第一个数字",n1);
        //     let n2 = await getNum(1000);
        //     console.log("第er个数字",n2)
        //     let n3 = await getNum(2000);
        //     console.log("第san个数字",n3)
        //     console.log('总和'+(n1+n2+n3));
        // }

        // run()

        //generator函数  手动调用的 可以控制函数内部执行顺序，控制函数内部的状态

        function * run(){
            console.log("start");
            let n1 = yield getNum(1000);
            console.log("第一个数字",n1);
            let n2 = yield getNum(1000);
            console.log("第er个数字",n2)
            let n3 = yield getNum(2000);
            console.log("第san个数字",n3)
            console.log('总和'+(n1+n2+n3));
        }

        let o = run();
        // console.log(o.next());

        o.next().value.then(res => {
            console.log(res);
            o.next(res*2)
        })



    </script>
</body>
</html>